package mx.ipn.persistencia.mysql;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

import mx.ipn.persistencia.FabricaDeDAOs;
import mx.ipn.persistencia.dao.DescuentoDAO;
import mx.ipn.persistencia.dao.DescuentoEmpleadoDAO;
import mx.ipn.persistencia.dao.EmpleadoDAO;
import mx.ipn.to.DescuentoEmpleadoTO;
import mx.ipn.to.DescuentoTO;
import mx.ipn.to.EmpleadoTO;

public class DescuentoEmpleadoDAOMySQL implements DescuentoEmpleadoDAO {
	static{FabricaDeDAOsMySQL.iniciaLog(DescuentoEmpleadoDAOMySQL.class);}

	private static final String INSERT = "INSERT INTO descuento_empleado(id_descuento,id_empleado) VALUES(?,?)";
	private static final String UPDATE = "UPDATE descuento_empleado SET id_descuento=?,id_empleado=? WHERE id_descuento=? and id_empleado=?";
	
	private static final String FINDBYDESCUENTOEMPLEADO = "SELECT * FROM descuento_empleado WHERE id_descuento=? and id_empleado=?";
	
	private static final String SELECT = "SELECT * FROM descuento_empleado";
	
	private static final String SELECTBYDESCUENTO = "SELECT * FROM descuento_empleado WHERE id_descuento=?";
	private static final String SELECTBYEMPLEADO = "SELECT * FROM descuento_empleado WHERE id_empleado=?";

	@Override
	public DescuentoEmpleadoTO findDescuentoEmpleadoByDescuentoEmpleado(
			int idDescuento, int idEmpleado) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion
					.prepareStatement(FINDBYDESCUENTOEMPLEADO);

			ps.setInt(1, idDescuento);
			ps.setInt(2, idEmpleado);

			ResultSet rs = ps.executeQuery();

			if (rs.next()) {

				
				FabricaDeDAOs fabricaMySQL = FabricaDeDAOs
						.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);
				
				DescuentoDAO descuentoDAO = fabricaMySQL.getDescuentoDAO();
				EmpleadoDAO empleadoDAO = fabricaMySQL.getEmpleadoDAO();

				ArrayList<DescuentoTO> listDescuentoTO = new ArrayList<DescuentoTO>();
				ArrayList<EmpleadoTO> listEmpleadoTO = new ArrayList<EmpleadoTO>();
				listDescuentoTO
						.add(descuentoDAO.findDescuentoById(idDescuento));
				listEmpleadoTO.add(empleadoDAO.findEmpleadoById(idEmpleado));

				DescuentoTO[] arrDescuentoTO = (DescuentoTO[])listDescuentoTO.toArray(new DescuentoTO[listDescuentoTO.size()]);
				EmpleadoTO[] arrEmpleadoTO = (EmpleadoTO[])listEmpleadoTO.toArray(new EmpleadoTO[listEmpleadoTO.size()]);
				
				DescuentoEmpleadoTO descuentoEmpleadoTO = new DescuentoEmpleadoTO(
						arrDescuentoTO, arrEmpleadoTO);

				ps.close();
				conexion.close();
				return descuentoEmpleadoTO;
			}

			ps.close();
			conexion.close();
			return null;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public boolean insertDescuentoEmpleado(
			DescuentoEmpleadoTO descuentoEmpleadoTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(INSERT);

			ps.setInt(1, descuentoEmpleadoTO.getIdDescuento());
			ps.setInt(2, descuentoEmpleadoTO.getIdEmpleado());

			ps.executeUpdate();

			ps.close();
			conexion.close();

			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}

	@Override
	public ArrayList<DescuentoEmpleadoTO> selectDescuentoEmpleado() {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			
			FabricaDeDAOs fabricaMySQL = null;
			
			DescuentoDAO descuentoDAO = null;
			EmpleadoDAO empleadoDAO = null;

			ArrayList<DescuentoEmpleadoTO> descuentoEmpleadoTO = null;
			DescuentoEmpleadoTO descuentoEmpleadoTO2 = null;

			PreparedStatement ps = conexion.prepareStatement(SELECT);

			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (descuentoEmpleadoTO == null) {
					descuentoEmpleadoTO = new ArrayList<DescuentoEmpleadoTO>();
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					descuentoDAO = fabricaMySQL.getDescuentoDAO();
					empleadoDAO = fabricaMySQL.getEmpleadoDAO();
				}

				int idDescuento = rs.getInt("id_descuento");
				int idEmpleado = rs.getInt("id_empleado");

				ArrayList<DescuentoTO> listDescuentoTO = new ArrayList<DescuentoTO>();
				ArrayList<EmpleadoTO> listEmpleadoTO = new ArrayList<EmpleadoTO>();

				listDescuentoTO
						.add(descuentoDAO.findDescuentoById(idDescuento));
				listEmpleadoTO.add(empleadoDAO.findEmpleadoById(idEmpleado));

				DescuentoTO[] arrDescuentoTO = (DescuentoTO[])listDescuentoTO.toArray(new DescuentoTO[listDescuentoTO.size()]);
				EmpleadoTO[] arrEmpleadoTO = (EmpleadoTO[])listEmpleadoTO.toArray(new EmpleadoTO[listEmpleadoTO.size()]);
				
				descuentoEmpleadoTO2 = new DescuentoEmpleadoTO(arrDescuentoTO,
						arrEmpleadoTO);

				descuentoEmpleadoTO.add(descuentoEmpleadoTO2);
			}
			ps.close();
			conexion.close();
			return descuentoEmpleadoTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public DescuentoEmpleadoTO selectDescuentoEmpleadoByDescuento(
			int idDescuento) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			// Crea la fabrica especifica de MySQL
			FabricaDeDAOs fabricaMySQL = null;
			// Crea un DAO para la tabla Cliente
			DescuentoDAO descuentoDAO = null;
			EmpleadoDAO EmpleadoDAO = null;

			ArrayList<EmpleadoTO> listEmpleadoTO = null;
			ArrayList<DescuentoTO> listDescuentoTO = null;

			DescuentoEmpleadoTO descuentoEmpleadoTO = null;

			PreparedStatement ps = conexion.prepareStatement(SELECTBYDESCUENTO);
			ps.setInt(1, idDescuento);
			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listEmpleadoTO == null) {

					listEmpleadoTO = new ArrayList<EmpleadoTO>();
					listDescuentoTO = new ArrayList<DescuentoTO>();

					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					EmpleadoDAO = fabricaMySQL.getEmpleadoDAO();
					descuentoDAO = fabricaMySQL.getDescuentoDAO();
				}

				listEmpleadoTO.add(EmpleadoDAO.findEmpleadoById(rs
						.getInt("id_empleado")));

			}
			if (listEmpleadoTO != null) {

				listDescuentoTO.add(descuentoDAO.findDescuentoById(idDescuento));
				
				DescuentoTO[] arrDescuentoTO = (DescuentoTO[])listDescuentoTO.toArray(new DescuentoTO[listDescuentoTO.size()]);
				EmpleadoTO[] arrEmpleadoTO = (EmpleadoTO[])listEmpleadoTO.toArray(new EmpleadoTO[listEmpleadoTO.size()]);
				
				descuentoEmpleadoTO = new DescuentoEmpleadoTO(
						arrDescuentoTO, arrEmpleadoTO);
			}
			ps.close();
			conexion.close();
			return descuentoEmpleadoTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public DescuentoEmpleadoTO selectDescuentoEmpleadoByEmpleado(int idEmpleado) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			
			FabricaDeDAOs fabricaMySQL = null;
			
			DescuentoDAO descuentoDAO = null;
			EmpleadoDAO empleadoDAO = null;

			ArrayList<EmpleadoTO> listEmpleadoTO = null;
			ArrayList<DescuentoTO> listDescuentoTO = null;

			DescuentoEmpleadoTO descuentoEmpleadoTO = null;

			PreparedStatement ps = conexion.prepareStatement(SELECTBYEMPLEADO);
			ps.setInt(1, idEmpleado);
			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listEmpleadoTO == null) {

					listEmpleadoTO = new ArrayList<EmpleadoTO>();
					listDescuentoTO = new ArrayList<DescuentoTO>();

					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					empleadoDAO = fabricaMySQL.getEmpleadoDAO();
					descuentoDAO = fabricaMySQL.getDescuentoDAO();
				}

				listDescuentoTO.add(descuentoDAO.findDescuentoById(rs
						.getInt("id_descuento")));

			}
			if (listEmpleadoTO != null) {

				listEmpleadoTO.add(empleadoDAO.findEmpleadoById(idEmpleado));

				DescuentoTO[] arrDescuentoTO = (DescuentoTO[])listDescuentoTO.toArray(new DescuentoTO[listDescuentoTO.size()]);
				EmpleadoTO[] arrEmpleadoTO = (EmpleadoTO[])listEmpleadoTO.toArray(new EmpleadoTO[listEmpleadoTO.size()]);
				
				descuentoEmpleadoTO = new DescuentoEmpleadoTO(
						arrDescuentoTO, arrEmpleadoTO);
			}
			ps.close();
			conexion.close();
			return descuentoEmpleadoTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public short updateDescuentoEmpleado(
			DescuentoEmpleadoTO descuentoEmpleadoTO,
			DescuentoEmpleadoTO descuentoEmpleadoTONuevo) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(UPDATE);

			ps.setInt(1, descuentoEmpleadoTONuevo.getIdDescuento());
			ps.setInt(2, descuentoEmpleadoTONuevo.getIdEmpleado());
			ps.setInt(3, descuentoEmpleadoTO.getIdDescuento());
			ps.setInt(4, descuentoEmpleadoTO.getIdEmpleado());

			ps.executeUpdate();

			if (ps.getUpdateCount() == 0) {
				ps.close();
				conexion.close();
				return 0;
			} else {
				ps.close();
				conexion.close();
				return 1;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return (short) -1;
		}
	}

}
